#ifndef COMMON_CONFIG_H
#define COMMON_CONFIG_H

/**
 * @file config.h
 * @brief 项目全局配置参数定义
 * @details 集中管理Raft协议、协程调度及系统运行的核心配置参数，
 *          采用命名空间隔离，所有参数为编译期常量，确保访问效率和全局一致性。
 *          配置参数按功能模块分组，便于维护和扩展。
 */

/**
 * @namespace common
 * @brief 公共模块命名空间，包含全局配置、工具类等通用组件
 */

namespace common {

/**
 * @defgroup 调试配置
 * @brief 控制调试行为的相关参数
 * @{
 */

/**
 * @brief 调试模式开关
 * @note 启用时（true）会输出详细的调试日志和状态信息，
 *       生产环境必须设为false以提升性能并减少日志开销
 */
const bool DEBUG = true;

/**
 * @brief 时间参数调试系数
 * @details 用于在调试环境下成比例缩放所有时间参数（单位：毫秒），
 *          例如设置为10可将所有超时时间延长10倍，便于观察分布式系统行为。
 *          生产环境应保持为1
 */
const int DEBUG_MUL = 1;

/** @} */ // 调试配置结束

/**
 * @defgroup Raft协议配置
 * @brief Raft一致性协议核心参数
 * @{
 */

/**
 * @brief 心跳超时时间（毫秒）
 * @details Leader向Follower发送心跳消息的间隔时间，
 *          必须满足：HeartBeatTimeout < minRandomizedElectionTime，
 *          建议值为选举超时时间的1/10 ~ 1/5，确保Leader能稳定维持领导地位
 */
const int HEART_BEAT_TIMEOUT = 25 * DEBUG_MUL;

/**
 * @brief 日志应用到状态机的间隔时间（毫秒）
 * @details 定期将已提交的日志条目批量应用到状态机的时间间隔，
 *          短间隔提升实时性，长间隔减少状态机操作开销，需根据业务场景平衡
 */
const int APPLY_INTERVAL = 10 * DEBUG_MUL;

/**
 * @brief 最小选举超时时间（毫秒）
 * @details Follower在未收到Leader心跳时，等待发起选举的最小时间，
 *          与maxRandomizedElectionTime配合，通过随机取值避免集群同时选举冲突
 */
const int MIN_RANDOMIZED_ELECTION_TIME = 300 * DEBUG_MUL;

/**
 * @brief 最大选举超时时间（毫秒）
 * @details Follower在未收到Leader心跳时，等待发起选举的最大时间，
 *          实际超时时间会在[min, max]范围内随机生成
 */
const int MAX_RANDOMIZED_ELECTION_TIME = 500 * DEBUG_MUL;

/**
 * @brief 共识操作超时时间（毫秒）
 * @details 客户端等待集群达成共识的最大时间，超过此时间则认为操作失败，
 *          需大于选举超时时间，建议为最大选举超时时间的1.5-2倍
 */
const int CONSENSUS_TIMEOUT = 500 * DEBUG_MUL;

/** @} */ // Raft协议配置结束

/**
 * @defgroup 协程配置
 * @brief 协程调度器相关参数
 * @{
 */

/**
 * @brief 协程库线程池大小
 * @details 配置协程调度器使用的工作线程数量，
 *          建议值为CPU核心数，单机测试时可设为1简化调试
 */
const int FIBER_THREAD_NUM = 1;

/**
 * @brief 是否使用调用者线程执行协程调度任务
 * @details true：使用发起协程的线程参与调度，可减少线程切换开销
 *          false：仅使用线程池中的线程执行调度，适合IO密集型场景
 */
const bool FIBER_USE_CALLER_THREAD = false;

/** @} */ // 协程配置结束

}   // namespace common

#endif  // COMMON_CONFIG_H